package in.lib.view; import in.lib.manager.SettingsManager; import in.lib.utils.Dimension; import in.rob.client.R; import java.util.ArrayList; import java.util.List; import net.callumtaylor.swipetorefresh.view.RefreshableListView; import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageLoadingListener; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.PauseOnScrollListener; public class HeadedListView extends RefreshableListView implements OnScrollListener { private View mHeaderView; private ImageView mHeaderImage; private int mScrollState; private PauseOnScrollListener pauseListener; private List<OnScrollListener> mOnScrollListener; private int mMaxImageHeight = 200; public interface OnScrollListener { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); public void onScrollStateChanged(AbsListView view, int scrollState); public void onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); } public HeadedListView(Context context) { super(context); init(); } public HeadedListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { Dimension dimen = new Dimension(getContext()); if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { mMaxImageHeight = (int)dimen.getHeightFromRatio(170); } else { mMaxImageHeight = (int)dimen.getHeightFromRatio(230); } mOnScrollListener = new ArrayList<OnScrollListener>(); setHeaderView(R.layout.headed_listview_header_view); pauseListener = new PauseOnScrollListener(ImageLoader.getInstance(), true, true); setOnScrollListener(this); } public int getScrollState() { return mScrollState; } public void addOnScrollListener(OnScrollListener l) { this.mOnScrollListener.add(l); } public void removeOnScrollListener(OnScrollListener l) { this.mOnScrollListener.remove(l); } public void setOnScrollListener(OnScrollListener l) { this.mOnScrollListener.clear(); this.mOnScrollListener.add(l); } public void setHeaderView(View v) { mHeaderView = v; mHeaderImage = (ImageView)mHeaderView.findViewById(R.id.header_image); if (mHeaderImage == null) { throw new IllegalArgumentException("You must have an ImageView with the id @id/header_image"); } mHeaderImage.setAdjustViewBounds(true); addHeaderView(mHeaderView, null, false); } public void setHeaderView(int res) { LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); setHeaderView(inflater.inflate(res, null)); } public void setHeaderImage(int res) { mHeaderImage.setImageResource(res); recalcSizes(); } public void setHeaderImage(Bitmap image) { mHeaderImage.setImageBitmap(image); recalcSizes(); } public void setHeaderUrl(String url) { if (mHeaderImage instanceof ImageView) { DisplayImageOptions opts = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisc(true) .showImageOnLoading(R.drawable.default_cover) .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) .resetViewBeforeLoading(true) .showImageForEmptyUri(R.drawable.default_cover) .build(); ImageLoader.getInstance().displayImage(url, mHeaderImage, opts, new ImageLoadingListener() { @Override public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) { recalcSizes(); } @Override public void onLoadingCancelled(String arg0, View arg1) { recalcSizes(); } @Override public void onLoadingFailed(String arg0, View arg1, FailReason arg2) { recalcSizes(); } @Override public void onLoadingStarted(String arg0, View arg1) { } }); } } private void recalcSizes() { if (mHeaderImage != null && mHeaderImage.getDrawable() != null) { double ratio = (double)mHeaderImage.getDrawable().getIntrinsicWidth() / (double)mHeaderImage.getDrawable().getIntrinsicHeight(); int newWidth = getMeasuredWidth(); int newHeight = (int)Math.round(newWidth / ratio); mHeaderImage.setMinimumHeight(mMaxImageHeight); mHeaderImage.setMaxHeight(mMaxImageHeight); ViewGroup.LayoutParams lp = mHeaderImage.getLayoutParams(); lp.height = mMaxImageHeight; mHeaderImage.setLayoutParams(lp); mHeaderImage.setScaleType(newHeight < mMaxImageHeight ? ScaleType.FIT_XY : ScaleType.CENTER_CROP); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed) { recalcSizes(); } super.onLayout(changed, l, t, r, b); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { pauseListener.onScrollStateChanged(view, scrollState); mScrollState = scrollState; if (mOnScrollListener != null) { for (OnScrollListener l : mOnScrollListener) { l.onScrollStateChanged(view, scrollState); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { pauseListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); if (mOnScrollListener != null) { for (OnScrollListener l : mOnScrollListener) { l.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } } if (mHeaderImage != null && SettingsManager.isCoverImageAnimationEnabled()) { float yTop = mHeaderView.getTop(); if (yTop > 0) { return; } mHeaderImage.scrollTo(0, (int)(yTop * 0.4)); } } }